﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 约瑟夫出局问题
{
    class Program
    {
        static void Main(string[] args)
        {
            GetNum(11, 3);
        }

        /// <summary>
        /// 输出剩下的是第几个人，输入玩游戏的人的个数
        /// </summary>
        /// <param name="n">参加游戏的人数</param>
        /// <param name="m">数的数字是几</param>
        static void GetNum(int n, int m)
        {
            bool[] b = new bool[n];
            // 使用True表示在游戏里面，使用false表示出局
            for (int i = 0; i < n; i++)
            {//刚开始都在游戏里面，所以都是true
                b[i] = true;
            }
            //在游戏的人数
            int sum = b.Length;
            // 计数器
            int x = 0;
            // 至少有两个人的时候才能玩游戏，外层循环控制玩的轮数
            while (sum > 1)
            {
                // 让每个人数数
                for (int i = 0; i < b.Length; i++)
                {
                    // 当人是true的时候才能数数
                    if (b[i])
                    {
                        // 每进行一次，x都会加1
                        x++;
                        if (x == m)
                        {
                            b[i] = false;
                            x = 0;
                            sum--;
                        }
                    }
                }
            }
            for (int i = 0; i < b.Length; i++)
            {
                if (b[i])
                {
                    Console.WriteLine(i + 1);
                }
            }
        }
    }
}
